<?php 
/* --------------------------------
 * Модуль отправки почты  
 * date
 * © Deemon 
 --------------------------------*/
 class email extends Load_use
 {
	function send()
	{
		$method=!isset($this->params['method'])||$this->params['method']=='smtp'?'smtp':'simple';		
		$message=$this->getParam('message',false);
		if($message && $message !='')
		{
			$subject=isset($this->params['subject'])?$this->params['subject']:'';
			$name_to=isset($this->params['name_to'])?$this->params['name_to']:MAIL_TO_NAME;
			$mail_to=isset($this->params['mail_to'])?$this->params['mail_to']:MAIL_TO_ADRESS;
			$sender_name=isset($this->params['sender_name'])?$this->params['sender_name']:MAIL_SENDER_NAME;
			$sender_adress=isset($this->params['sender_adress'])?$this->params['sender_adress']:MAIL_SENDER_ADRESS;
			return $this->$method($subject, $message, $name_to, $mail_to, $sender_name, $sender_adress);
		}
		$this->add_log('Текст почтового сообщения пуст, либо отсутсвует.',DEE_NOTICE);
		return false;
	}
	

//Обычная отправка
	private function simple($subject,  $message,
		$name_to=MAIL_TO_NAME, $mail_to=MAIL_TO_ADRESS,  
		$sender_name=MAIL_SENDER_NAME, $sender_adress=MAIL_SENDER_ADRESS)
	{
		$headers = 'From: =?utf-8?B?'.base64_encode($sender_name).'?= <'.$sender_adress.">\r\n";
		$headers .= "Content-type: text/html; charset=utf-8\r\n";
		$headers .= "Mime-Version: 1.0\r\n";
		$mail=mail(
			'=?utf-8?B?' . base64_encode($name_to) . '?= <' . $mail_to . '>',
			'=?utf-8?B?'.base64_encode($subject).'?=',
			$message,
			$headers);
		if($mail)
		{
			$this->elog->add('Письмо успешно отправлено адресату обычным образом',DEE_NOTICE);
			return true;
		}		
		$this->elog->add('Отправка письма обычным образом не удалсть',DEE_ERROR);
		return false;
	}

//SMTP отправка
	private function smtp( $subject,  $message,
		$name_to=MAIL_TO_NAME, $mail_to=MAIL_TO_ADRESS,  
		$sender_name=MAIL_SENDER_NAME, $sender_adress=MAIL_SENDER_ADRESS ) 
	{
		//Формирую тело письма
		$SEND =  'Date: '.date('D, d M Y H:i:s') . " UT\r\n";
		$SEND .= 'Subject: '.$subject."\r\n";
		$SEND .= 'Reply-To: '.SMTP_USERNAME."\r\n";
		$SEND .= "MIME-Version: 1.0\r\n";
		$SEND .= 'Content-Type: text/html; charset="utf-8"'."\r\n";
		$SEND .= "Content-Transfer-Encoding: 8bit\r\n";
		$SEND .= 'From: "'.$sender_name.'" <'.$sender_adress.">\r\n";

		//1 письмо или множественная отправка
		if(is_array($mail_to))
		{
			$mail_to_one = array_shift($mail_to);
			$SEND .= "To: <$mail_to_one>\r\n";
		}
		else
		{
			$mail_to_one = $mail_to;
			$SEND .= "To: \"$name_to\" <$mail_to_one>\r\n";
		}
		
		$SEND .= "X-Priority: 3\r\n\r\n";
		$SEND .=  $message."\r\n\r\n.";
		$socket=false;
		//Открываю сокет
		if(!$socket=fsockopen(SMTP_HOST, SMTP_PORT, $errno, $errstr, 30)) 
		{
			$this->elog->add( $errno."&lt;br&gt;".$errstr,DEE_ERROR);
			return false;
		}
		//Порядок запросов с SMTP
		$action=array(
			array('put'=>false,'resp'=>'220','err'=>'Ошибка при отправке почты'),
			array('put'=>'HELO '.SMTP_HOST,'resp'=>'250','err'=>'Ошибка при отправке HELO'),
			array('put'=>'AUTH LOGIN','resp'=>'334','err'=>'Нет ответа на запрос авторизации'),
			array('put'=>base64_encode(SMTP_USERNAME),'resp'=>'334','err'=>'Логин не принят'),
			array('put'=>base64_encode(SMTP_PASSWORD),'resp'=>'235','err'=>'Пароль не принят'),
			array('put'=>'MAIL FROM: <'.$sender_adress.'>','resp'=>'250','err'=>'Ошибка при отправке MAIL FROM:')	
		);

		//множественная отправка почты
		if(is_array($mail_to))
		{
			if(!empty($mail_to))
			{
				foreach($mail_to as $mail)
				{
					$action[] = array('put'=>'RCPT TO: <'.$mail.'>','resp'=>'250','err'=>'Ошибка при отправке RCPT TO:');
				}
			}
		}
		else
			$action[] = array('put'=>'RCPT TO: <'.$mail_to.'>','resp'=>'250','err'=>'Ошибка при отправке RCPT TO:');	

		$action[] = array('put'=>'DATA','resp'=>'354','err'=>'Ошибка при отправке DATA');
		$action[] = array('put'=>$SEND,'resp'=>'250','err'=>'Ошибка при отправке тела письма');
		if($socket)
		{
			foreach($action as $i=>$val)
			{
				if($val['put'])fputs($socket, $val['put']."\r\n");
				$request=true;
				$server_response='';
				while (substr($server_response, 3, 1) != ' ') 
					if (!($server_response = fgets($socket, 256)))
					$request=false;
				if(substr($server_response, 0, 3) !=  $val['resp'])
					$request=false;
				if (!$request) 
				{
					$this->elog->add($i.$val['err'],DEE_ERROR);
					fclose($socket);
					return false;
				}
			}
			fputs($socket, "QUIT\r\n");
			fclose($socket);
			$this->elog->add('Письмо успешно отправлено адресату',DEE_NOTICE);
			return true;
		}
		return false;
	}

 }
 